home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack#3b.sfx / hack#3-4.txt < prev   
Text File  |  1990-02-12  |  18KB  |  710 lines

  1. 3.4. ╨┴├╦┴╟┼ ╒╙┴╟┼
  2.  
  3. ╘HE FOLLOWING PSEUDO-CODE OUTLINES HOW A USER PROGRAM IS EXPECTED TO USE THE
  4. BURST READING PACKAGE:
  5.  
  6. .     JSR PUT_FILENAME_INTO_BURST┬UF
  7. .     LDX #FILENAME_LENGTH
  8. .     LDA #DEVICE_NUMBER
  9. .     JSR BURST╧PEN
  10. .     BCS REPORT┼RROR
  11. . ╠1: JSR PROCESS_BURST┬UF_DATA
  12. .     LDA BURST╙TATUS
  13. .     CMP #$1F
  14. .     BEQ ╠2
  15. .     JSR BURST╥EAD
  16. .     BCC ╠1
  17. .     JSR REPORT┼RROR
  18. . ╠2: JSR BURST├LOSE
  19.  
  20. 4. ╔═╨╠┼═┼╬╘┴╘╔╧╬
  21.  
  22. ╘HIS SECTION DISCUSSES THE CODE THAT IMPLEMENTS THE WORD COUNTING PROGRAM.  ╔T
  23. IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEEDED BY A FEW SPECIAL
  24. CHARACTERS AND THE LINE NUMBER.  ╘HE SPECIAL CHARACTERS ARE THERE TO ALLOW YOU
  25. TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE (AND ALL
  26. OF MY UGLY COMMENTS).  ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS EXECUTE THE
  27. FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
  28.  
  29. GREP '^\.%...\!' ╚ACK3 ▄ SED 'S/^.%...\!..//' ▄ SED 'S/.%...\!//' >WC.ASM
  30.  
  31.  
  32. .%001!  ;╫ORD ├OUNT UTILITY USING THE BURST COMMAND SET'S ╞ASTLOAD FACILITY
  33. .%002!  ;WRITTEN 92/06/25 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
  34. .%003!
  35.  
  36. ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A FEW SETUP
  37. DIRECTIVES.
  38.  
  39. .%004!  .MEM
  40. .%005!  .BANK 15
  41. .%006!  .ORG $1C01
  42. .%007!
  43. .%008!  ;*** ┬┴╙╔├ STARTUP CODE
  44. .%009!
  45.  
  46. ╘HIS IS WHAT THE "10 SYS 7200" IN ┬┴╙╔├ LOOKS LIKE.  ╔T IS HERE SO THIS
  47. PROGRAM CAN BE EXECUTED WITH ┬┴╙╔├ ╥╒╬ COMMAND.
  48.  
  49. .%010!  .WORD $1C1C
  50. .%011!  .WORD 10
  51. .%012!  .BYTE $9E
  52. .%013!  .ASC  " 7200 : "
  53. .%014!  .BYTE $8F
  54. .%015!  .ASC  " 6502 POWER!"
  55. .%016!  .BYTE 0
  56. .%017!  .WORD 0
  57. .%018!  .WORD 0
  58. .%019!
  59. .%020!  JMP MAIN
  60. .%021!
  61. .%022!  ;========== BURST READ LIBRARY ==========
  62. .%023!
  63. .%024!  BURST╙TATUS = $FE
  64. .%025!  BURST┬UF├OUNT = $FF
  65. .%026!  BURST┬UF = $B00
  66.  
  67. "SERIAL╞LAG" IS USED TO DETERMINE WHETHER A DEVICE IS ╞AST OR NOT, AND THE
  68. "IO╙TATUS" (A.K.A. "╙╘") IS TO TELL IF A DEVICE IS PRESENT OR NOT.
  69.  
  70. .%027!  SERIAL╞LAG = $A1C
  71. .%028!  IO╙TATUS = $90
  72.  
  73. "CIA╔CR" IS THE INTERRUPT CONTROL REGISTER OF ├╔┴#1.  ╔T IS POLLED TO WAIT FOR
  74. DATA BECOMING AVAILABLE IN THE SHIFT REGISTER ("CIA─ATA").  "CIA╙ERIAL├LK" IS
  75. THE ╙LOW SERIAL BUS CLOCK LINE THAT IS USED FOR HANDSHAKING ON THE ╞AST BUS.
  76.  
  77. .%029!  CIA╔CR = $DC0D
  78. .%030!  CIA╙ERIAL├LK = $DD00
  79. .%031!  CIA─ATA = $DC0C
  80. .%032!
  81. .%033!  KERNEL╠ISTEN = $FFB1
  82. .%034!  KERNEL╙ECOND = $FF93
  83. .%035!  KERNEL├IOUT  = $FFA8
  84. .%036!  KERNEL╒NLSN  = $FFAE
  85. .%037!  KERNEL╙PINP  = $FF47
  86. .%038!
  87.  
  88. ╘HIS IS THE ERROR CODE VALUE THIS PACKAGE RETURNS IF IT DETECTS THAT A DEVICE
  89. IS NOT ╞AST.
  90.  
  91. .%039!  ERR╬OT┬URST─EVICE = 10
  92. .%040!
  93. .%041!  BURST╞ILENAME╠EN = BURST┬UF├OUNT
  94. .%042!
  95. .%043!  BURST╧PEN = * ;(.┴=─EVICE, BURST┬UF=╞ILENAME, .╪=╬AME╠EN):<FIRST BLOCK>
  96.  
  97. ╙ET UP FOR A BURST OPEN: CLEAR THE ╞AST FLAG AND THE DEVICE NOT PRESENT FLAG.
  98.  
  99. .%044!     STX BURST╞ILENAME╠EN
  100. .%045!     PHA
  101. .%046!     LDA SERIAL╞LAG
  102. .%047!     AND #%10111111
  103. .%048!     STA SERIAL╞LAG
  104. .%049!     LDA #0
  105. .%050!     STA IO╙TATUS
  106. .%051!     PLA
  107.  
  108. ├OMMAND THE DISK DEVICE TO ╠ISTEN.  ╘HEN CHECK IF THE DEVICE IS PRESENT OR NOT
  109. (BIT 7 OF IO╙TATUS).  ╔F NOT PRESENT, RETURN THE KERNEL ERROR CODE.
  110.  
  111. .%052!     JSR KERNEL╠ISTEN
  112. .%053!     BIT IO╙TATUS
  113. .%054!     BPL +
  114. .%055!
  115. .%056!     DEV╬OT╨RESENT = *
  116. .%057!     JSR KERNEL╒NLSN
  117. .%058!     LDA #5
  118. .%059!     SEC
  119. .%060!     RTS
  120. .%061!
  121.  
  122. ╘ELL DISK DEVICE TO LISTEN ON THE COMMAND CHANNEL (CHANNEL #15).
  123.  
  124. .%062!  +  LDA #$6F
  125. .%063!     JSR KERNEL╙ECOND
  126.  
  127. ╙END THE "╒0"+├╚╥$(159) BURST COMMAND HEADER.
  128.  
  129. .%064!     LDA #"U"
  130. .%065!     JSR KERNEL├IOUT
  131. .%066!     BIT IO╙TATUS
  132. .%067!     BMI DEV╬OT╨RESENT
  133. .%068!     LDA #"0"
  134. .%069!     JSR KERNEL├IOUT
  135. .%070!     LDA #$9F
  136. .%071!     JSR KERNEL├IOUT
  137.  
  138. ╙END THE FILENAME.
  139.  
  140. .%072!     LDY #0
  141. .%073!  -  LDA BURST┬UF,Y
  142. .%074!     JSR KERNEL├IOUT
  143. .%075!     INY
  144. .%076!     CPY BURST╞ILENAME╠EN
  145. .%077!     BCC -
  146.  
  147. ╞INISH SENDING THE BURST COMMAND AND MAKE SURE THE DEVICE IS ╞AST.
  148.  
  149. .%078!     JSR KERNEL╒NLSN
  150. .%079!     LDA SERIAL╞LAG
  151. .%080!     AND #$40
  152. .%081!     BNE +
  153. .%082!     SEC
  154. .%083!     LDA #ERR╬OT┬URST─EVICE
  155. .%084!     RTS
  156. .%085!
  157.  
  158. ─ISABLE INTERRUPTS.
  159.  
  160. .%086!  +  SEI
  161.  
  162. ╨REPARE TO RECEIVE DATA AND SIGNAL THE DISK DRIVE TO START SENDING (BY
  163. TOGGLING THE SLOW SERIAL ├LOCK LINE).
  164.  
  165. .%087!     CLC
  166. .%088!     JSR KERNEL╙PINP
  167. .%089!     BIT CIA╔CR
  168. .%090!     LDA CIA╙ERIAL├LK
  169. .%091!     EOR #$10
  170. .%092!     STA CIA╙ERIAL├LK
  171.  
  172. ╥EAD THE FIRST SECTOR OF THE FILE.
  173.  
  174. .%093!     JSR BURST╥EAD
  175.  
  176. ├HECK FOR ERRORS.  ┬URST ERROR CODE 2 (FILE NOT FOUND) IS TRANSLATED TO ITS
  177. KERNEL EQUIVALENT.
  178.  
  179. .%094!     LDA BURST╙TATUS
  180. .%095!     CMP #2
  181. .%096!     BCC +
  182. .%097!     BNE SHORT╞ILE
  183. .%098!     SEC
  184. .%099!     LDA #4
  185. .%100!  +  RTS
  186. .%101!
  187.  
  188. ├HECK IF THIS IS A ONE-BLOCK FILE.
  189.  
  190. .%102!     SHORT╞ILE = *
  191. .%103!     CMP #$1F
  192. .%104!     BNE OPEN┼RROR
  193. .%105!     LDY BURST┬UF├OUNT
  194. .%106!     LDX #2
  195. .%107!
  196.  
  197. ╔F SO, WE HAVE TO READ THE TWO BYTES THAT THE DISK DRIVE FORGOT TO TELL US
  198. ABOUT.  ╞OR EACH BYTE, WE WAIT FOR FOR THE ╙HIFT ╥EGISTER ╥EADY SIGNAL, TOGGLE
  199. THE CLOCK, AND READ THE SHIFT DATA REGISTER.  ╔ CAN GET AWAY WITH READING THE
  200. DATA REGISTER AFTER SENDING THE ACKNOWLEDGE SIGNAL TO THE DISK DRIVE BECAUSE ╔
  201. AM RUNNING WITH INTERRUPTS DISABLED AND IT COULD NOT POSSIBLY SEND THE NEXT
  202. BYTE BEFORE ╔ PICK UP THE CURRENT ONE.  ╫E WOULDN'T WANT ANY ╬═╔S HAPPENING
  203. WHILE DOING THIS, THOUGH.
  204.  
  205. .%108!     SHORT╞ILE┬YTE = *
  206. .%109!     LDA #$08
  207. .%110!  -  BIT CIA╔CR
  208. .%111!     BEQ -
  209. .%112!     LDA CIA╙ERIAL├LK
  210. .%113!     EOR #$10
  211. .%114!     STA CIA╙ERIAL├LK
  212. .%115!     LDA CIA─ATA
  213. .%116!     STA BURST┬UF,Y
  214. .%117!     INY
  215. .%118!     DEX
  216. .%119!     BNE SHORT╞ILE┬YTE
  217.  
  218. ╙TORE THE UPDATED BYTE COUNT AND EXIT.
  219.  
  220. .%120!     STY BURST┬UF├OUNT
  221. .%121!     CLC
  222. .%122!     RTS
  223. .%123!
  224.  
  225. ╔N THE EVENT OF A BURST ERROR, RE-ENABLE THE INTERRUPTS SINCE THE USER MIGHT
  226. NOT CALL THE BURST├LOSE ROUTINE.  ╥ETURN THE TRANSLATED ERROR CODE.
  227.  
  228. .%124!     OPEN┼RROR = *
  229. .%125!     CLI
  230. .%126!     SEC
  231. .%127!     ORA #$10
  232. .%128!     RTS
  233. .%129!
  234.  
  235. ╥EAD THE NEXT SECTOR OF THE FILE.
  236.  
  237. .%130!  BURST╥EAD = * ;( ) : BURST┬UF, BURST┬UF├OUNT, BURST╙TATUS
  238.  
  239. ╫AIT FOR THE STATUS BYTE TO ARRIVE.
  240.  
  241. .%131!     LDA #8
  242. .%132!  -  BIT CIA╔CR
  243. .%133!     BEQ -
  244.  
  245. ╘OGGLE CLOCK LINE FOR ACKNOWLEDGE.
  246.  
  247. .%134!     LDA CIA╙ERIAL├LK
  248. .%135!     EOR #$10
  249. .%136!     STA CIA╙ERIAL├LK
  250.  
  251. ╟ET STATUS BYTE AND CHECK.  ╔F 2 OR MORE AND NOT $1╞, THEN AN ERROR HAS
  252. OCCURRED.  ╔F 0, THEN PREPARE TO READ 254 DATA BYTES.
  253.  
  254. .%137!     LDA CIA─ATA
  255. .%138!     STA BURST╙TATUS
  256. .%139!     LDX #254
  257. .%140!     CMP #2
  258. .%141!     BCC ACTUAL╥EAD
  259. .%142!     CMP #$1F
  260. .%143!     BNE OPEN┼RROR
  261.  
  262. ╔F STATUS BYTE IS $1╞, THEN GET THE NEXT BYTE, WHICH TELLS HOW MANY DATA BYTES
  263. ARE TO FOLLOW.
  264.  
  265. .%144!     LDA #8
  266. .%145!  -  BIT CIA╔CR
  267. .%146!     BEQ -
  268. .%147!     LDX CIA─ATA
  269. .%148!     LDA CIA╙ERIAL├LK
  270. .%149!     EOR #$10
  271. .%150!     STA CIA╙ERIAL├LK
  272. .%151!
  273. .%152!     ACTUAL╥EAD = *
  274. .%153!     STX BURST┬UF├OUNT
  275. .%154!     LDY #0
  276. .%155!
  277.  
  278. ╥EAD THE DATA BYTES AND PUT THEM INTO THE BURST BUFFER.  ╘HE CLOCK LINE TOGGLE
  279. VALUE IS COMPUTED BEFORE RECEIVING THE DATA FOR A LITTLE EXTRA ZIP.  ╔ HAVEN'T
  280. EXPERIMENTED WITH THIS, BUT YOU MIGHT BE ABLE TO TOGGLE THE CLOCK LINE BEFORE
  281. RECEIVING THE DATA (HOWEVER, PROBABLY NOT FOR THE FIRST BYTE).
  282.  
  283. .%156!     READ┬YTE = *
  284. .%157!     LDA CIA╙ERIAL├LK
  285. .%158!     EOR #$10
  286. .%159!     TAX
  287. .%160!     LDA #8
  288. .%161!  -  BIT CIA╔CR
  289. .%162!     BEQ -
  290. .%163!     STX CIA╙ERIAL├LK
  291. .%164!     LDA CIA─ATA
  292. .%165!     STA BURST┬UF,Y
  293. .%166!     INY
  294. .%167!     CPY BURST┬UF├OUNT
  295. .%168!     BNE READ┬YTE
  296. .%169!  +  CLC
  297. .%170!     RTS
  298. .%171!
  299.  
  300. ├LOSE THE BURST PACKAGE: SIMPLY ├╠╔.
  301.  
  302. .%172!  BURST├LOSE = *
  303. .%173!     CLI
  304. .%174!     CLC
  305. .%175!     RTS
  306. .%176!
  307. .%177!  ;========== MAIN PROGRAM ==========
  308. .%178!
  309.  
  310. ╘HIS IS THE WORD COUNTING APPLICATION CODE.
  311.  
  312. .%179!  BK╫├ = $0E
  313. .%180!  BK╙ELECT = $FF00
  314. .%181!  KERNEL├HRIN  = $FFCF
  315. .%182!  KERNEL├HROUT = $FFD2
  316. .%183!
  317.  
  318. ╘HE "WC╔N╫ORD" IS A BOOLEAN VARIABLE THAT TELLS WHETHER THE FILE SCANNER IS
  319. CURRENTLY IN A WORD OR NOT.  ╘HE ╠INES, ╫ORDS, AND ┬YTES ARE 24-BIT COUNTERS.
  320.  
  321. .%184!  WC╔N╫ORD = 2 ;(1)
  322. .%185!  WC╠INES = 3  ;(3)
  323. .%186!  WC╫ORDS = 6  ;(3)
  324. .%187!  WC┬YTES = 9  ;(3)
  325. .%188!
  326. .%189!  MAIN = *
  327.  
  328. ╨UT THE KERNEL ╥╧═ AND ╔/╧ SPACE INTO CONTEXT THEN INITIALIZE THE COUNTING
  329. VARIABLES.
  330.  
  331. .%190!     LDA #BK╫├
  332. .%191!     STA BK╙ELECT
  333. .%192!     JSR WC╔NIT
  334.  
  335. ╞OLLOW THE BURST READING PROCEDURE OUTLINE.
  336.  
  337. .%193!     JSR WC╟ET╞ILENAME
  338. .%194!     JSR BURST╧PEN
  339. .%195!     BCC +
  340. .%196!     JSR REPORT┼RROR
  341. .%197!     RTS
  342. .%198!  /  JSR WC╙CAN┬UFFER
  343. .%199!     LDA BURST╙TATUS
  344. .%200!     CMP #$1F
  345. .%201!     BEQ +
  346. .%202!     JSR BURST╥EAD
  347. .%203!     BCC -
  348. .%204!     JSR REPORT┼RROR
  349. .%205!  +  JSR BURST├LOSE
  350.  
  351. ╥EPORT THE NUMBERS OF LINES, WORDS, AND CHARACTERS AND THEN EXIT.
  352.  
  353. .%206!     JSR WC╥EPORT
  354. .%207!     RTS
  355. .%208!
  356.  
  357. ╔NITIALIZE THE VARIABLES.
  358.  
  359. .%209!  WC╔NIT = *
  360. .%210!     LDA #0
  361. .%211!     LDX #8
  362. .%212!  -  STA WC╠INES,X
  363. .%213!     DEX
  364. .%214!     BPL -
  365. .%215!     STA WC╔N╫ORD
  366. .%216!     RTS
  367. .%217!
  368.  
  369. ╟ET THE DEVICE AND FILENAME FROM THE USER.  ╥ETURNS PARAMETERS SUITABLE FOR
  370. PASSING TO BURST╧PEN.
  371.  
  372. .%218!  WC╟ET╞ILENAME = * ;() : BURST┬UF=╞ILENAME, .┴=─EVICE, .╪=╞ILENAME╠EN
  373.  
  374. ─ISPLAY THE PROMPT.
  375.  
  376. .%219!     LDX #0
  377. .%220!  -  LDA PROMPT═SG,X
  378. .%221!     BEQ +
  379. .%222!     JSR KERNEL├HROUT
  380. .%223!     INX
  381. .%224!     BNE -
  382.  
  383. ╟ET THE INPUT LINE FROM THE USER.
  384.  
  385. .%225!  +  LDX #0
  386. .%226!  -  JSR KERNEL├HRIN
  387. .%227!     STA BURST┬UF,X
  388. .%228!     CMP #13
  389. .%229!     BEQ +
  390. .%230!     INX
  391. .%231!     BNE -
  392. .%232!  +  JSR KERNEL├HROUT
  393.  
  394. ┼XTRACT THE DEVICE NUMBER FROM THE START OF THE INPUT LINE.  ╔F IT IS NOT
  395. THERE, ASSUME DEVICE NUMBER 8.
  396.  
  397. .%233!     LDA #8
  398. .%234!     CPX #2
  399. .%235!     BCC FILENAME┼XIT
  400. .%236!     LDY BURST┬UF+1
  401. .%237!     CPY #":"
  402. .%238!     BNE FILENAME┼XIT
  403. .%239!     SEC
  404. .%240!     LDA BURST┬UF
  405. .%241!     SBC #"A"-8
  406. .%242!     TAY
  407.  
  408. ╔F A DEVICE NAME WAS PRESENT, THEN WE HAVE TO MOVE THE REST OF THE FILENAME
  409. BACK OVER IT NOW THAT WE'VE EXTRACTED IT.
  410.  
  411. .%243!     LDX #0
  412. .%244!  -  LDA BURST┬UF+2,X
  413. .%245!     STA BURST┬UF,X
  414. .%246!     CMP #13
  415. .%247!     BEQ +
  416. .%248!     INX
  417. .%249!     BNE -
  418. .%250!  +  TYA
  419. .%251!     FILENAME┼XIT = *
  420. .%252!     RTS
  421. .%253!
  422. .%254!     PROMPT═SG = *
  423. .%255!     .ASC "ENTER FILENAME IN FORM FILENAME, OR A:FILENAME, "
  424. .%256!     .ASC "OR B:FILENAME, ..."
  425. .%257!     .BYTE 13
  426. .%258!     .ASC "WHERE 'A' IS FOR DEVICE 8, 'B' IS FOR DEVICE 9, ..."
  427. .%259!     .BYTE 13,0
  428. .%260!
  429.  
  430. ╙CAN THE BURST BUFFER AFTER READING A SECTOR INTO IT.
  431.  
  432. .%261!  WC╙CAN┬UFFER = *
  433. .%262!     LDY #0
  434. .%263!     CPY BURST┬UF├OUNT
  435. .%264!     BNE +
  436. .%265!     RTS
  437. .%266!  +  LDX WC╔N╫ORD
  438. .%267!  -  LDA BURST┬UF,Y
  439. .%268!  ;   JSR KERNEL├HROUT  ;UNCOMMENT THIS LINE TO ECHO THE DATA READ
  440. .%269!     CMP #13
  441. .%270!     BNE +
  442.  
  443. ╔F THE CURRENT CHARACTER IS A CARRIAGE RETURN, THEN INCREMENT THE LINE COUNT.
  444.  
  445. .%271!     INC WC╠INES
  446. .%272!     BNE +
  447. .%273!     INC WC╠INES+1
  448. .%274!     BNE +
  449. .%275!     INC WC╠INES+2
  450.  
  451. ╔F THE CHARACTER IS A ╘┴┬, ╙╨┴├┼, OR A ╥┼╘╒╥╬, THEN IT IS A ─ELIMITER;
  452. OTHERWISE, IT IS CONSIDERED A ╠ETTER.
  453.  
  454. .%276!  +  CMP #33
  455. .%277!     BCS IS╠ETTER
  456. .%278!     CMP #" "
  457. .%279!     BEQ IS─ELIMITER
  458. .%280!     CMP #13
  459. .%281!     BEQ IS─ELIMITER
  460. .%282!     CMP #9
  461. .%283!     BEQ IS─ELIMITER
  462. .%284!
  463. .%285!     IS╠ETTER = *
  464.  
  465. ╔F THE CHARACTER IS A ╠ETTER AND THE PREVIOUS ONE WAS A ─ELIMITER, THEN
  466. INCREMENT THE WORD COUNT.
  467.  
  468. .%286!     CPX #1
  469. .%287!     BEQ SCAN├ONT
  470. .%288!     LDX #1
  471. .%289!     INC WC╫ORDS
  472. .%290!     BNE SCAN├ONT
  473. .%291!     INC WC╫ORDS+1
  474. .%292!     BNE SCAN├ONT
  475. .%293!     INC WC╫ORDS+2
  476. .%294!     JMP SCAN├ONT
  477. .%295!
  478. .%296!     IS─ELIMITER = *
  479. .%297!     LDX #0
  480. .%298!
  481. .%299!     SCAN├ONT = *
  482. .%300!     INY
  483. .%301!     CPY BURST┬UF├OUNT
  484. .%302!     BCC -
  485.  
  486. ┴DD THE NUMBER OF BYTES IN THE BURST BUFFER TO THE TOTAL BYTE COUNT FOR THE
  487. FILE.
  488.  
  489. .%303!     CLC
  490. .%304!     LDA WC┬YTES
  491. .%305!     ADC BURST┬UF├OUNT
  492. .%306!     STA WC┬YTES
  493. .%307!     BCC +
  494. .%308!     INC WC┬YTES+1
  495. .%309!     BNE +
  496. .%310!     INC WC┬YTES+2
  497. .%311!  +  STX WC╔N╫ORD
  498. .%312!     RTS
  499. .%313!
  500.  
  501. ╥EPORT THE NUMBER OF LINES, WORDS, AND BYTES READ.  ╒SES A "PRINTF" TYPE OF
  502. SCHEME.
  503.  
  504. .%314!  WC╥EPORT = *
  505. .%315!     LDX #0
  506. .%316!  -  LDA REPORT═SG,X
  507. .%317!     BEQ REPORT┼XIT
  508. .%318!     CMP #13
  509. .%319!     BCS +
  510. .%320!     STX 14
  511. .%321!     TAX
  512. .%322!     LDA 2,X
  513. .%323!     STA 15
  514. .%324!     LDA 0,X
  515. .%325!     LDY 1,X
  516. .%326!     LDX 15
  517. .%327!     JSR PUTNUM
  518. .%328!     LDX 14
  519. .%329!     JMP REPORT├ONT
  520. .%330!  +  JSR KERNEL├HROUT
  521. .%331!     REPORT├ONT = *
  522. .%332!     INX
  523. .%333!     BNE -
  524. .%334!     REPORT┼XIT = *
  525. .%335!     RTS
  526. .%336!
  527. .%337!     REPORT═SG = *
  528. .%338!     .BYTE 13
  529. .%339!     .ASC "LINES="
  530. .%340!     .BYTE WC╠INES
  531. .%341!     .ASC ", WORDS="
  532. .%342!     .BYTE WC╫ORDS
  533. .%343!     .ASC ", CHARS="
  534. .%344!     .BYTE WC┬YTES,27
  535. .%345!     .ASC "Q"
  536. .%346!     .BYTE 13,0
  537. .%347!
  538.  
  539. ╥EPORTS THE ERROR NUMBER GIVEN IN THE .┴ REGISTER.  ├ALLED AFTER AN ERROR IS
  540. RETURNED FROM A BURST ROUTINE.
  541.  
  542. .%348!  REPORT┼RROR = * ;( .┴=ERR╬UM )
  543. .%349!     PHA
  544. .%350!     LDX #0
  545. .%351!  -  LDA ERROR═SG,X
  546. .%352!     BEQ +
  547. .%353!     JSR KERNEL├HROUT
  548. .%354!     INX
  549. .%355!     BNE -
  550. .%356!  +  PLA
  551. .%357!     LDY #0
  552. .%358!     LDX #0
  553. .%359!     JSR PUTNUM
  554. .%360!     LDA #13
  555. .%361!     JSR KERNEL├HROUT
  556. .%362!     RTS
  557. .%363!
  558. .%364!     ERROR═SG = *
  559. .%365!     .ASC "*** I/O ERROR #"
  560. .%366!     .BYTE 0
  561. .%367!
  562. .%368!  ;==========LIBRARY==========
  563. .%369!
  564.  
  565. ╥OUTINE TO PRINT OUT THE 24-BIT NUMBER GIVEN IN .┴┘╪.
  566.  
  567. .%370!  LIBWORK = $60
  568. .%371!  ITOA┬IN = LIBWORK
  569. .%372!  ITOA┬CD = LIBWORK+3
  570. .%373!  ITOA╞LAG = LIBWORK+7
  571. .%374!
  572. .%375!  PUTNUM = *
  573.  
  574. ╔NITIALIZE BINARY AND ┬├─ (┬INARY ├ODED ─ECIMAL) REPRESENTATIONS OF NUMBER.
  575.  
  576. .%376!     STA ITOA┬IN+0
  577. .%377!     STY ITOA┬IN+1
  578. .%378!     STX ITOA┬IN+2
  579. .%379!     LDX #3
  580. .%380!     LDA #0
  581. .%381!  -  STA ITOA┬CD,X
  582. .%382!     DEX
  583. .%383!     BPL -
  584. .%384!     STA ITOA╞LAG
  585. .%385!     LDY #24
  586. .%386!     SED
  587. .%387!
  588.  
  589. ╥OTATE EACH BIT OUT OF THE BINARY NUMBER AND THEN MULTIPLY THE ┬├─ NUMBER BY
  590. TWO AND ADD THE BIT IN.  ┼FFECTIVELY, WE ARE SHIFTING THE BITS OUT OF THE
  591. BINARY NUMBER AND INTO THE ┬├─ REPRESENTATION OF THE NUMBER.
  592.  
  593. .%388!     ITOA╬EXT┬IT = *
  594. .%389!     ASL ITOA┬IN+0
  595. .%390!     ROL ITOA┬IN+1
  596. .%391!     ROL ITOA┬IN+2
  597. .%392!     LDX #3
  598. .%393!  -  LDA ITOA┬CD,X
  599. .%394!     ADC ITOA┬CD,X
  600. .%395!     STA ITOA┬CD,X
  601. .%396!     DEX
  602. .%397!     BPL -
  603. .%398!     DEY
  604. .%399!     BNE ITOA╬EXT┬IT
  605. .%400!     CLD
  606.  
  607. ╘AKE THE ┬├─ BYTES AND SPIT OUT THE TWO DIGITS THEY CONTAIN.
  608.  
  609. .%401!     LDX #0
  610. .%402!     LDY #0
  611. .%403!  -  LDA ITOA┬CD,X
  612. .%404!     JSR ITOA╨UT╚EX
  613. .%405!     INX
  614. .%406!     CPX #4
  615. .%407!     BCC -
  616. .%408!     RTS
  617. .%409!
  618. .%410!     ITOA╨UT╚EX = *
  619. .%411!     PHA
  620. .%412!     LSR
  621. .%413!     LSR
  622. .%414!     LSR
  623. .%415!     LSR
  624. .%416!     JSR ITOA╨UT─IGIT
  625. .%417!     PLA
  626. .%418!     AND #$0F
  627. .%419!
  628.  
  629. ╨RINT OUT THE INDIVIDUAL DIGITS OF THE NUMBER.  ╔F THE CURRENT DIGIT IS ZERO
  630. AND ALL DIGITS SO FAR HAVE BEEN ZERO, THEN DON'T OUTPUT ANYTHING, UNLESS IT IS
  631. THE LAST DIGIT OF THE NUMBER.
  632.  
  633. .%420!     ITOA╨UT─IGIT = *
  634. .%421!     CMP ITOA╞LAG
  635. .%422!     BNE +
  636. .%423!     CPY #7
  637. .%424!     BCC ITOA╨UT─IGIT┼XIT
  638. .%425!  +  ORA #$30
  639. .%426!     STA ITOA╞LAG
  640. .%427!     JSR KERNEL├HROUT
  641. .%428!     ITOA╨UT─IGIT┼XIT = *
  642. .%429!     INY
  643. .%430!     RTS
  644.  
  645. 5. ╒╒┼╬├╧─┼─ ╨╥╧╟╥┴═
  646.  
  647. ╚ERE IS THE BINARY EXECUTABLE IN UUENCODED FORM.  ╘HE ├╥├32 OF IT IS
  648. 3676144922.  ╠╧┴─ AND ╥╒╬ IT LIKE A REGULAR ┬┴╙╔├ PROGRAM.
  649.  
  650. BEGIN 640 WC
  651. ═└1╨<'└╚└╟┬└╫,├└╨(#╚@├╥└╓-3└╥(%!/5╘52(0└└└└└└3!$=┴╧](╦1╨**;^-
  652. ═'└╩╔└(60:""╤_╥20$└<@╦╧^╔!3┴@╩6\@─_^╔52"╚_╥20,.╬╔,""╚_┌╞?(*├_
  653. ═╚└"┘└└╠@╩/_(╤/^0]2"╬_┌╘<"┬┼└╘└0╪╩0╔@>!@@1_\╠#=╥═└-╒)$(╘└╫2"]
  654. ═'*7^╥0*0!=└$.*─$8,─?╘"&─_┌("╩0@╠#=╙╨^┌╘└╫4─0├0#=╦0╙<╞0└+╥,╦0
  655. ═┘╪3_&&!8.└─08*─(+└╫<\/╬═└-╒)$(╘└╫:╘,╫(7^╚╧[)└╔└6╥1_0╫:─(+└╫<
  656. ═\/╬╬#-╥═└-╒)$(╘└╫8;_╚└"═└-╒)$*╩╔""╨-╫/#[├@#=╦0╙<╞0└+╥,3_╘.48
  657. ═8%@88*─.├0#_(#╘=($─=(",<─└0@╚!┘@(└4>╔?[)'_└((+╘<─/(@╚!╪@#┴╘@
  658. ═6╤┘@╩0"┬")4#╥┴#[┴0)@╚@"]├1╫╨!┬#2_^├0]:(└(,__╟0└+╥0╫╨└^├0\╥#2
  659. ═╠┌─(╪└*0'╩╨!"\└┌╘!<╪╦0└+┌3╞╚╚@"]└@╬=└└╧)#?└#┌-#╙╞&!%3┼1%4┬!&
  660. ═24╤%3─%-12!)3┬!&3╒)-($9)3$5.04╒%+"!/4┬!!.─9)3$5.04╒%+"!/4┬!"
  661. ═.─9)3$5.04╒%+"└╬+┬╪-5╘┴%4─4@)╘$╟($┼3($9/4┬!$159)0╘4@."╨@)╘(╟
  662. ═($┼3($9/4┬!$159)0╘4@.2╨@+┬╪╬#0"@└,3_╘└%@╔@*┘└└╧)#=└*┘@/0!╬8$
  663. ═╘└+╞!<─┴╠└╙)(/└;╥0╫╨%\─)\!/@└?└1╚@'╞!═└+┘@?0!^8(3$0>╚@#(╤/^0
  664. ═╤1┬┼"67_┴0╞0!╬8*╘└+╞"╪8"8*(└╧8(>\!_)#;└5┴@┌╩═0*%#[4└═└&╞#╥#,
  665. ═'╩8.3'╪>(-+_┌-#<8└╒,24┘%4╙╘#+"!73╒)$4╙╘&+"!#2$%24╙╘)&╒$-└$┬┬
  666. ═└+╓\'╧└&(-+_┌-#╒:*└└╚@└@╙!┌╔#2#2_╓└╩*┬╚@22]/($524─]2(",└┴6"$
  667. ═889┬╚@.╔└)5├╥┴#[┴6>@&/@&8"9┴)╞*┬└[5├=6.58\╚0]╪├0[-┬┬└*└└═6,@
  668. ─!!_╚╪└20]╞!(2─╔*2┬└/'╓@╔#\5╟╘└3└!┘└'"3"%9╥#2_\┴@└└└└
  669. END
  670.  
  671. 6. ╥┼╞┼╥┼╬├┼╙
  672.  
  673. [1] ├OMMODORE ┬USINESS ═ACHINES, _├OMMODORE_1571_─ISK_─RIVE_╒SER'S_╟UIDE_,
  674.     ├┬═, 1985.
  675.  
  676. [2] ╥AINER ┼LLINGER, _1571_╔NTERNALS_, ┴BACUS ╙OFTWARE, ╩UNE 1986.
  677.  
  678. ===============================================================================
  679. ╬EXT ╔SSUE: (HOPEFULLY!)
  680.  
  681. ╠EARNING ═╠ - ╨ART 4
  682.  
  683.   ╔N THE NEXT ISSUE WE'LL EMBARK ON A PROJECT OF MAKING A SPACE INVADERS STYLE
  684. GAME FOR THE ├=64/128 USING THE ╦┼╥╬┴╠ ROUTINES WE'VE LEARNED.
  685.  
  686. ╘HE ─EMO ├ORNER: ╞╠╔ - MORE COLOR TO THE SCREEN
  687.  
  688.   ┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64.
  689. ╞╠╔ PICTURE CAN HAVE ALL OF THE 16 COLORS IN ONE CHAR POSITION. ╫HAT THEN
  690. IS THIS ╞╠╔ AND HOW IT IS DONE ?
  691.  
  692. ╘HE 1351 ═OUSE ─EMYSTIFIED
  693.  
  694.   ┴N INDEPTH LOOK AT HOW THE 1351 MOUSE OPERATES AND HOW TO ACCESS IT WITHIN
  695. YOUR OWN ═╠ PROGRAMS.  ╞OR ┬ASIC PROGRAMMERS, A DRIVER FOR THE 80 COLUMN SCREEN
  696. IS ALSO SUPPLIED.
  697.  
  698. ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
  699.  
  700. ╘HIS ARTICLE WILL PRESENT A PACKAGE THAT READS ═╙-─╧╙ FILES AND THE ROOT
  701. DIRECTORY OF ═╙-─╧╙ DISKS.  ╘HIS PACKAGE WILL USE THE DYNAMIC MEMORY ALLOCATION
  702. PACKAGE INTRODUCED IN ╚ACKING ╔SSUE #2 TO ALLOW LARGE FILES TO BE READ IN.
  703. ╘HE APPLICATION-LEVEL CODE HASN'T BEEN FINALIZED YET, BUT IT WILL PROBABLY USE
  704. A MENU-ORIENTED FULL-SCREEN DISPLAY AND WILL READ AND TRANSLATE ═╙-─╧╙ AND
  705. ├OMMODORE FILES.
  706. =============================================================================
  707. ┼╬─ OF ├OMMODORE ╚ACKING ╔SSUE 3.
  708. =============================================================================
  709.